package GUI;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.ArrayList;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.UIManager;

import Reproductor.Almacen;
import Reproductor.Cancion;
import XML.CargadoXML;
import XML.GuardadoXML;
import de.javasoft.plaf.synthetica.SyntheticaClassyLookAndFeel;

public class InterfazPrincipal extends JFrame{

	 /**
	  * Declaracion de atributos de la clase InterfazPrincipal
	  */
	private JMenuBar barraMenu=null;
	private JMenu archivoMenu=null;
	private JMenu edicionMenu=null;
	private JMenu ayudaMenu=null;
	
	private JMenuItem nuevaLista=null;
	private JMenuItem cargaAudio=null;
	private JMenuItem cargaCarpeta=null;
	private JMenuItem buscar=null;
	private JMenuItem manualUsuario=null;
	private JMenuItem importarBiblioteca=null;
	private JMenuItem exportarBiblioteca=null;
	
	private JMenuItem eliminarAudio=null;
	private JMenuItem eliminarAudioBiblioPopup=null;
	private JMenuItem eliminarAudioPopup=null;
	
	private JMenuItem anadirBibliotecaPopup=null;
	private JMenuItem limpiarPopup=null;

	
	private JMenu verMenu=null;
	private JCheckBoxMenuItem verBiblioteca=null;
	private JCheckBoxMenuItem mostrarReproduccion=null;

	
	private JPanel panelPrincipal=null;
	private PanelReproductor panelReproductor;
	private static InterfazBiblioteca panelBiblio;
	private static InterfazListaReproduccion panelListaRepro;

	private static Almacen almacen = new Almacen();
	private JPopupMenu popMenu = null;
	private JPopupMenu popMenuListaReproduccion = null;
	private ArrayList<Cancion> listaCancionesBiblio;
	
	private static PanelBusqueda panelBusqueda;
	

	/**
	  * Llamadas a las inicializaciones. Por defecto importaremos un XML que esta en una
	  * ruta predefinida en la funcion inicializaBiblioteca().
	  */
	public InterfazPrincipal(){
		super();
		//Importamos biblioteca por defecto
		inicializaBiblioteca();	
		inicializar();
	}
	
	
	/**
	  * Inicializa la interfaz principal, que incluye:</br>
	  * -El JFrame</br>
	  * -El panel reproductor</br>
	  * -El panel de biblioteca</br>
	  * -El panel de la lista de reproduccion</br>
	  * -El panel de busqueda</br>
	  * -Se crea un oyente para que cuando se cierre la ventana, la biblioteca se 
	  * guarde en nuestro XML por defecto</br>
	  */
	private void inicializar() {
		
		
		
		//Inicializa el JFrame
		this.setSize(1020,600);
		this.setJMenuBar(getMenu());
		this.setResizable(false);
		
		
		//Crea panel principal
		panelPrincipal=new JPanel();
		panelPrincipal.setLayout(null);
	
		//Crea el panel reproductor y lo agnade al panel principal
		panelReproductor = new PanelReproductor(getAlmacen());
		panelReproductor.setBounds(50, 10, 700, 100);
		panelPrincipal.add(panelReproductor);
		panelPrincipal.setVisible(true);
		panelReproductor.setVisible(true);
		
		//Creamos el panel de la biblioteca
		panelBiblio=new InterfazBiblioteca();
		panelBiblio.setBounds(40, 150, 710, 350);
		panelPrincipal.add(panelBiblio);		
		
		
		//Creamos el panel de reproduccion
		panelListaRepro=new InterfazListaReproduccion(panelReproductor);
		panelListaRepro.setBounds(750, 0, 300, 500);
		panelPrincipal.add(panelListaRepro);


		//Crea el panel de busqueda
		panelBusqueda = new PanelBusqueda();
		panelBusqueda.setBounds(40, 150, 710, 350);
		panelBusqueda.setVisible(false);
		panelPrincipal.add(panelBusqueda);
		
		
		
		this.setContentPane(panelPrincipal);
		this.setTitle("Reproductor");
		
		
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				String path=""; 
				path = System.getProperty("user.dir") + "\\BibliotecaXML\\fich.b10";
				GuardadoXML.guardarBiblioteca(getAlmacen(),path);
				System.exit(0);
			}
		});
		//PANEL BIBLIO VISIBLE
		cambiaPanel(true);
	}
	
	/**
	  * Se inicializa la barra de menu y se devuelve
	  * @return: la Barra ya creada.
	  */
	private JMenuBar getMenu(){
		if(barraMenu==null){
			barraMenu=new JMenuBar();
			barraMenu.add(getArchivoMenu());
			barraMenu.add(getEdicionMenu());
			barraMenu.add(getAyudaMenu());
		}
		return barraMenu;
	}
	
	/**
	  * Se crean los oyentes para los siguientes elementos del menu:</br>
	  * -Nueva lista de reproduccion</br>
	  * -Cargar Audio</br>
	  * -Cargar Carpeta</br>
	  * -Importar Biblioteca</br>
	  * -Exportar biblioteca
	  * @return: Se devuelve Archivo, con sus submenus ya creados y agnadidos a el.
	  */
	private JMenu getArchivoMenu() {
		if(archivoMenu==null){
			archivoMenu=new JMenu();
			archivoMenu.setText("Archivo");
			if(nuevaLista==null){
				nuevaLista=new JMenuItem();
				nuevaLista.setText("Nueva Lista de Reproduccion");
				nuevaLista.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						getAlmacen().setListaReproduccion(new ArrayList<Cancion>());
						panelListaRepro.actualizaListaReproduccion();
					}
				});			
			}
			
			archivoMenu.add(nuevaLista);

			if(cargaAudio==null){
				cargaAudio=new JMenuItem();
				cargaAudio.setText("Cargar Audio");
				cargaAudio.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						JFileChooser seleccion=new JFileChooser() {
							public boolean accept (File fichero){
						        return fichero.getPath().toLowerCase().endsWith(".mp3") || fichero.isDirectory();
						   }
						};
						File f= new File(System.getProperty("user.dir"));
						seleccion.setCurrentDirectory(f);
						seleccion.setDialogTitle("Cargar Audio");						
						int fd1=seleccion.showOpenDialog(InterfazPrincipal.this);
						if (fd1==0){
						    String fichero = seleccion.getSelectedFile().getPath();
						    Cancion cancionNueva = new Cancion(fichero);
						    getAlmacen().anadirListaRep(cancionNueva);
						    panelListaRepro.actualizaListaReproduccion();
						}
					}
				});			
			}
			
			archivoMenu.add(cargaAudio);
			
			if(cargaCarpeta==null){
				cargaCarpeta=new JMenuItem();
				cargaCarpeta.setText("Cargar Carpeta");
				cargaCarpeta.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						JFileChooser seleccion=new JFileChooser() {
							public boolean accept (File fichero){
						        return fichero.getPath().toLowerCase().endsWith(".mp3") || fichero.isDirectory();
						   }
						};
						File f= new File(System.getProperty("user.dir"));
						seleccion.setCurrentDirectory(f);
						seleccion.setDialogTitle("Cargar Carpeta");
						
						seleccion.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//DIRECTORIES_ONLY);
						seleccion.setAcceptAllFileFilterUsed(false);

						int fd1=seleccion.showOpenDialog(InterfazPrincipal.this);
						if (fd1==0 && seleccion.getSelectedFile().isDirectory()){
							String archivo="";
							String ruta="";
							
							
							if(System.getProperty("os.name").equals("Linux")){
								ruta=seleccion.getSelectedFile().getPath() + '/';
							}
							else{		
								ruta=seleccion.getSelectedFile().getPath() + '\\';
							}
									
						    String[] ficheros = new File(seleccion.getSelectedFile().getPath()).list();
						    for (int i=0; i<ficheros.length ; i++){
						    	archivo=ficheros[i];
						    	if (archivo.toLowerCase().endsWith(".mp3") && !(new File(ruta+archivo).isDirectory())){
							    	Cancion cancionNueva = new Cancion(ruta + archivo);
								    getAlmacen().anadirListaRep(cancionNueva);
						    	}
						    }
						    
						   
						    panelListaRepro.actualizaListaReproduccion();
						}
					}
				});			
			}
			
			archivoMenu.add(cargaCarpeta);

			if(importarBiblioteca==null){
				importarBiblioteca=new JMenuItem();
				importarBiblioteca.setText("Importar Biblioteca");
				importarBiblioteca.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						JFileChooser seleccion=new JFileChooser();
						File f= new File(System.getProperty("user.dir"));
						seleccion.setCurrentDirectory(f);
						seleccion.setDialogTitle("Importar Biblioteca");	
						
						
						int fd1=seleccion.showOpenDialog(null);
						if (fd1==0){
						    String fichero = seleccion.getSelectedFile().getPath();		
						    
						    almacen.setBiblioteca(CargadoXML.cargarBiblioteca(fichero));
						    panelBiblio.setListaCancionesTabla(almacen.listarBiblioteca());
						    panelBiblio.actualizarBiblioteca();
						}
					}
				});			
			}
			
			archivoMenu.add(importarBiblioteca);
			
			if(exportarBiblioteca==null){
				exportarBiblioteca=new JMenuItem();
				exportarBiblioteca.setText("Exportar Biblioteca");
				exportarBiblioteca.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						JFileChooser seleccion=new JFileChooser();
						File f= new File(System.getProperty("user.dir"));
						seleccion.setCurrentDirectory(f);
						seleccion.setDialogTitle("Exportar Biblioteca");	
						int fd1=seleccion.showSaveDialog(null);
						if (fd1==0){
						    String fichero = seleccion.getSelectedFile().getPath();			 
						    GuardadoXML.guardarBiblioteca(almacen, fichero);
						}
					}
				});			
			}
			
			archivoMenu.add(exportarBiblioteca);

		}
		return archivoMenu;
	}
	
	
	/**
	 * Se crean los oyentes para la pestagna Edicion del menu, en concreto:</br>
	 * -Busqueda avanzada</br>
	 * -Mostrar solo reproduccion(Maximizar o minimizar la interfaz)
	 * @return: devuelve el menu edicionMenu con sus submenus ya creados.
	 */
	private JMenu getEdicionMenu() {
		if(edicionMenu==null){
			edicionMenu=new JMenu();
			edicionMenu.setText("Edicion");
			if(buscar==null){
				buscar=new JMenuItem();
				buscar.setText("Busqueda Avanzada");
				buscar.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						cambiaPanel(false);
					}
				});			
			}
						
			edicionMenu.add(buscar);
			
			if(verMenu==null){
				verMenu=new JMenu();
				verMenu.setText("Ver");

				if(mostrarReproduccion==null){
					mostrarReproduccion=new JCheckBoxMenuItem();
					mostrarReproduccion.setText("Mostrar solo Reproduccion");
					mostrarReproduccion.addActionListener(new ActionListener(){
						public void actionPerformed(ActionEvent e){
							if (mostrarReproduccion.getState()){
								minimizarFrame();
							}
							else{
								maximizarFrame();
							}
						}
					});
					
					verMenu.add(mostrarReproduccion);
				}		
			}
			edicionMenu.add(verMenu);	
		}
		return edicionMenu;
	}
	
	/**
	 * Crea un oyente para el uso del manual de usuario
	 * @return Devuelve el menu de ayuda.
	 */
	private JMenu getAyudaMenu() {
		if(ayudaMenu==null){
			ayudaMenu=new JMenu();
			ayudaMenu.setText("Ayuda");
			if(manualUsuario==null){
				manualUsuario=new JMenuItem();
				manualUsuario.setText("Manual de Usuario");
				manualUsuario.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						abrirArchivoExterno();
					}
				});			
			}
						
			ayudaMenu.add(manualUsuario);
		}	
		return ayudaMenu;
	}
	
	/**
	 * Minimiza la interfaz al modo Solo reproduccion
	 */
	public void minimizarFrame(){
		this.setSize(765,220);
	}
	
	/**
	 * Maximiza la interfaz y muestra todos sus elementos (panel de biblioteca,
	 * panel de lista de reproduccion, panel de busqueda, etc...)
	 */
	public void maximizarFrame(){
		this.setSize(1020,600);
	}
		
	/**
	 * Cambia el modo de la Interfaz para ejecutar la busqueda y permite tambien
	 * volver al modo original, sin busqueda.
	 */
	public static void cambiaPanel(boolean verBiblio){
		if(verBiblio){
			panelBiblio.setVisible(true);
			panelBusqueda.setVisible(false);		
		}else{
			panelBusqueda.setVisible(true);
			panelBiblio.setVisible(false);
		}
	}
	
	/**
	 * Muestra el manual de usuario
	 */
	public static void abrirArchivoExterno(){
		try {
			Runtime.getRuntime().exec ("rundll32 SHELL32.DLL,ShellExec_RunDLL "+ System.getProperty("user.dir")+"\\Ayuda\\Manual_de_usuario.pdf");
		}
		catch (Exception e) {
		//	 JOptionPane.showMessageDialog(null, "No se encuentra el archivo de ayuda");
		}
			 
	}
	
	/**
	 * Inicializa la biblioteca cargando un XML por defecto.
	 */
	private void inicializaBiblioteca(){
		//Inicializa la biblioteca desde el XML por defecto
		String path="";
		
		if(System.getProperty("os.name").equals("Linux")){
			path = System.getProperty("user.dir") + "/BibliotecaXML/fich.b10";
		}
		else{		
			path = System.getProperty("user.dir") + "\\BibliotecaXML\\fich.b10";
		}
			
		listaCancionesBiblio = CargadoXML.cargarBiblioteca(path);
		getAlmacen().setBiblioteca(listaCancionesBiblio);	
		listaCancionesBiblio=CargadoXML.cargarBiblioteca(path);
	}

	/**
	 * Actualiza nuestro almacen a partir de uno dado.
	 * @param almacen: Almacen a partir del cual actualizaremos el nuestro.
	 */
	public static void setAlmacen(Almacen almacen) {
		InterfazPrincipal.almacen = almacen;
	}

	/**
	 * Devuelve el almacen.
	 * @return: almacen que vamos a devolver.
	 */
	public static Almacen getAlmacen() {
		return almacen;
	}

	/**
	 * Actualiza la parte de la interfaz de la biblioteca, el panel biblioteca.
	 */
	public static void actualizaBibloteca() {
		panelBiblio.actualizarBiblioteca();
		
	}
	
	/**
	 * Actualiza la parte de la interfaz de la lista de reproduccion.
	 */
	public static void actualizaListaReproduccion() {
		panelListaRepro.actualizaListaReproduccion();		
	}
	
	/**
	  * @param args: Array de argumentos.
	  */
	public static void main(String[] args) {
		
		try 
	    {
	      UIManager.setLookAndFeel(new SyntheticaClassyLookAndFeel());
	    } 
	    catch (Exception e) 
	    {
	      e.printStackTrace();
	    }

	    		JFrame.setDefaultLookAndFeelDecorated(true);			
		
	    						
				InterfazPrincipal c = new InterfazPrincipal();
				c.setEnabled(true);
				c.setVisible(true);	
	}


}
